package com.qf.service.impl;

import com.qf.dao.TbPermissionRepository;
import com.qf.dao.TbRolePressMapper;
import com.qf.dao.TbRolePressRepository;
import com.qf.dao.TbRoleRepository;
import com.qf.pojo.entity.TbPermission;
import com.qf.pojo.entity.TbRole;
import com.qf.pojo.request.TbRolePressReq;
import com.qf.pojo.request.TbRoleReq;
import com.qf.pojo.response.BasePermissionResponse;
import com.qf.pojo.response.BasePermissionValueResponse;
import com.qf.pojo.response.BaseResponse;
import com.qf.service.TbRoleService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

@Service
public class TbRoleServiceImpl implements TbRoleService {
    @Autowired
    TbRoleRepository tbroleRepository;
    @Autowired
    TbPermissionRepository tbPermissionRepository;
    @Autowired
    TbRolePressRepository tbRolePressRepository;
    @Autowired
    TbRolePressMapper tbRolePressMapper;
    /**
     * 查询所有角色
     * @param page 当前页
     * @param size 当前页显示行数
     * @return 响应对象
     */
    @Override
    public BaseResponse findAll(Integer page, Integer size) {
        PageRequest of = PageRequest.of(page - 1, size);
        Page<TbRole> all = tbroleRepository.findAll(of);
        List<TbRole> list = all.getContent();
        long total = all.getTotalElements();
        return new BaseResponse(1,"success",list,total);
    }

    /**
     * 修改或者新增角色
     *
     * @param tbRoleReq 请求角色
     * @return 响应对象
     */
    @Override
    public BaseResponse updateOrSave(TbRoleReq tbRoleReq) {
        TbRole tbRole = new TbRole();
        BeanUtils.copyProperties(tbRoleReq,tbRole);
        tbroleRepository.saveAndFlush(tbRole);
        return new BaseResponse().SUCCESS();
    }

    /**
     * 根据角色id删除角色
     *
     * @param roId 角色id
     * @return 响应对象
     */
    @Override
    public BaseResponse deleteById(Integer roId) {
        tbroleRepository.deleteById(roId);
        tbRolePressRepository.deleteByRoId(roId);
        return new BaseResponse().SUCCESS();
    }

    /**
     * 根据角色id查找权限
     *
     * @param roId 角色id
     * @return 响应对象
     */
    @Override
    public BaseResponse findPermissionByRoleId(Integer roId) {
        //1.封装了所有权限的集合
        //1.1查询出数据库中所有权限
        List<TbPermission> all = tbPermissionRepository.findAll();
        //1.2创建权限表将查询出来的权限放入
        List permissionList = new ArrayList<>();
        for (TbPermission list:all) {
            BasePermissionResponse basePermissionResponse = new BasePermissionResponse();
            basePermissionResponse.setKey(list.getPrId());
            basePermissionResponse.setLabel(list.getPrName());
            basePermissionResponse.setDisable(false);
            permissionList.add(basePermissionResponse);
        }
        //2.查询该角色所有的权限id
        List<Integer> permissionId = tbRolePressRepository.findPermissionIdByRoleId(roId);
        //3.将所有权限以及权限编号设置到公共返回值中
        BasePermissionValueResponse basePermissionValueResponse = new BasePermissionValueResponse();
        basePermissionValueResponse.setData(permissionList);
        basePermissionValueResponse.setValue(permissionId);
        return new BaseResponse(1,"success",basePermissionValueResponse,null);
    }

    /**
     * 修改或者新增角色权限
     *
     * @param tbRolePressReq 角色权限请求对象
     * @return 角色权限响应对象
     */
    @Override
    public BaseResponse updateRolePermission(TbRolePressReq tbRolePressReq) {
        //1.获取角色id
        Integer roId = tbRolePressReq.getRoId();
        //2.获取该角色对应的所有权限id
        List<Integer> permissionIdList = tbRolePressReq.getPermissionList();
        //3.通过权限对应的角色id查询该用户的所有权限
        List<Integer> permissionIdByRoleId = tbRolePressRepository.findPermissionIdByRoleId(roId);
        //4.进行判断
        if (permissionIdByRoleId != null){
            //4.1如果查询出该角色的权限列表不为空,则说明该角色有权限,我们需要将其权限全部删除
            tbRolePressMapper.deletePermissionByRoleId(roId);
        }
        //5.建立新的逻辑,使用动态sql语句,新增权限(foreach的使用)
        if (permissionIdList != null && permissionIdList.size()>0){
            tbRolePressMapper.addPermissionRole(tbRolePressReq);
        }
        return new BaseResponse().SUCCESS();
    }
}
